﻿using GZHJ.Tool;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VM.Shared.TestAttribute;

namespace 测试工具
{
    /// <summary>
    /// 音频测试
    /// </summary>
    public class 音频测试
    {
        /// <summary>
        /// 信噪比
        /// </summary>
        /// <param name="信号"></param>
        /// <param name="噪声"></param>
        /// <returns></returns>
        [ExposedMethodAttribute("")]
        public double 信噪比(double 信号, double 噪声)
        {
            if (噪声 == 0)
            {
                return -99999;
            }
            double logValue = 20 * Math.Log10(噪声 / 信号);
            LogHelper.Debug($"【信噪比】信号：{信号}，噪声：{噪声}，输出值：{Math.Abs(logValue)}");
            return Math.Abs(logValue);
        }
        /// <summary>
        /// 数组信噪比
        /// </summary>
        /// <param name="信号"></param>
        /// <param name="噪声"></param>
        /// <param name="索引"></param>
        /// <returns></returns>
        [ExposedMethodAttribute("")]
        public double 数组信噪比(double[] 信号, double[] 噪声, int 索引 = 0)
        {
            if (噪声[索引] == 0)
            {
                噪声[索引] = 0.0001;
            }
            double logValue = 20 * Math.Log10(噪声[索引] / 信号[索引]);
            LogHelper.Debug($"【数组信噪比】信号：{string.Join("，", 信号)}，噪声：{string.Join("，", 噪声)}，索引：{索引}，输出值：{Math.Abs(logValue)}");
            return Math.Abs(logValue);
        }
        /// <summary>
        /// 通道平衡度
        /// </summary>
        /// <param name="信号"></param>
        /// <param name="索引1"></param>
        /// <param name="索引2"></param>
        /// <returns></returns>
        [ExposedMethodAttribute("")]
        public double 通道平衡度(double[] 信号, int 索引1 = 0, int 索引2 = 0)
        {
            if (信号[索引1] == 0)
            {
                信号[索引1] = 0.0001;
            }

            double logValue = 20 * Math.Log10(信号[索引2] / 信号[索引1]);
            LogHelper.Debug($"【通道平衡度】信号：{string.Join("，", 信号)}，索引1：{索引1}，索引2：{索引2}，输出值：{Math.Abs(logValue)}");
            return Math.Abs(logValue);
        }
        [ExposedMethodAttribute("")]
        public double 通道平衡度_拓展(double[] 信号, int 索引1 = 0, int 索引2 = 0, double 值相同时增量 = 0.01)
        {
            if (信号[索引1] == 0)
            {
                信号[索引1] = 0.0001;
            }

            //当两个数相等的时候，计算出来的值 = 0，需要处理掉这个情况，因为Log10（1）= 0，2024-08-28，HGS
            if (信号[索引2] == 信号[索引1])
            {
                信号[索引1] = 信号[索引1] + 值相同时增量;  
            }

            double logValue = 20 * Math.Log10(信号[索引2] / 信号[索引1]);
            LogHelper.Debug($"【通道平衡度_拓展】信号：{string.Join("，", 信号)}，索引1：{索引1}，索引2：{索引2}，值相同时增量：{值相同时增量}，输出值：{Math.Abs(logValue)}");
            return Math.Abs(logValue);
        }
        /// <summary>
        /// USB频响测试
        /// </summary>
        /// <param name="幅值1">被除数</param>
        /// <param name="幅值2">除数</param>
        /// <param name="索引"></param>
        /// <returns></returns>
        [ExposedMethodAttribute("")]
        public double USB频响测试(double[] 幅值1, double[] 幅值2, int 索引 = 0)
        {
            if (幅值2[索引] == 0)
            {
                幅值1[索引] = 0.0001;
            }
            double logValue = 20 * Math.Log10(幅值1[索引] / 幅值2[索引]);
            LogHelper.Debug($"【USB频响测试】幅值1：{string.Join("，", 幅值1)}，幅值2：{string.Join("，", 幅值2)}，索引：{索引}，输出值：{Math.Abs(logValue)}");
            return Math.Abs(logValue);
        }
    }
}
